# main_ui.py
# 要运行此应用，请确保已安装必要的库:
# pip install nicegui python-dotenv pymysql pandas

from datetime import datetime
from nicegui import ui, app  # 添加 nicegui 导入
from dotenv import load_dotenv
import os
import io
import pandas as pd
from sqlalchemy import create_engine  # 新增导入
from ex4nicegui import bi
import theme

# 从新的逻辑文件中导入函数
from .attendance_logic import (
    connect_db,
    fetch_and_analysis,  # 新增导入
)

from entity.daily_attendance import DailyAttendance  # 新增导入
from ex4nicegui import rxui, to_ref

columns = [
    {"label": "工号", "field": "card_no", "sortable": True},
    {"label": "姓名", "field": "name", "sortable": True},
    {"label": "日期", "field": "date", "sortable": True},
    {"label": "上班状态", "field": "arrival_status", "sortable": True},
    {"label": "上班时间", "field": "arrival_time", "sortable": True},
    {"label": "下班状态", "field": "departure_status", "sortable": True},
    {"label": "下班时间", "field": "departure_time", "sortable": True},
]


class AttendancePage:
    def __init__(self):
        self.status_output = []
        self.df = pd.DataFrame()
        self.ds = bi.data_source(
            self.df
        )  # 绑定一个BiDataSource实例,当变化时可以业面thfc

    async def perform_analysis(self, start_date_input, end_date_input, result_area):
        self.status_output.clear()
        start_date_str = start_date_input.value
        end_date_str = end_date_input.value

        if not all([start_date_str, end_date_str]):
            ui.notify("所有字段均为必填项。", type="negative")
            self.status_output.append("错误：所有字段均为必填项。")
            # 删除 result_area.update()
            return

        try:
            start_date_dt = datetime.strptime(start_date_str, "%Y-%m-%d")
            end_date_dt = datetime.strptime(end_date_str, "%Y-%m-%d")
            if end_date_dt < start_date_dt:
                ui.notify("结束日期不能早于开始日期。", type="negative")
                self.status_output.append("错误：结束日期不能早于开始日期。")
                # 删除 result_area.update()
                return
        except ValueError:
            ui.notify("日期格式错误，请使用 YYYY-MM-DD 格式。", type="negative")
            self.status_output.append("错误：日期格式错误。")
            # 删除 result_area.update()
            return

        self.status_output.append("正在连接数据库并获取记录...")
        # 删除 result_area.update()

        connection = connect_db()

        if connection:
            try:
                self.df = fetch_and_analysis(start_date_str, end_date_str)
                self.ds.reload(self.df)  # 更新数据源，很重要。
                if df.empty:
                    self.status_output.append("在指定日期范围内未找到记录。")
                else:
                    self.status_output.append(f"\n结果已获取")

            except Exception as e:
                self.status_output.append(f"处理过程中发生错误: {e}")
                print(f"处理过程中发生错误: {e}")
            finally:
                connection.close()
                self.status_output.append("\n数据库连接已关闭。")
                print("\n数据库连接已关闭。")
        else:
            self.status_output.append("数据库连接失败，请检查连接信息和网络。")

        # 删除 result_area.update()

    def entry_page_content(self):
        # 第一行：查询日期和按钮
        with ui.card().classes("w-full"):
            with ui.row().classes("p-4 items-center"):
                ui.label("查询日期范围").classes("text-bold")
                ui.label("开始日期")
                start_date_input = ui.input(
                    value=datetime.now().strftime("%Y-%m-%d")
                ).props("type=date")
                ui.label("结束日期")
                end_date_input = ui.input(
                    value=datetime.now().strftime("%Y-%m-%d")
                ).props("type=date")

                ui.button(
                    "开始分析",
                    on_click=lambda: self.perform_analysis(
                        start_date_input,
                        end_date_input,
                        ui.markdown().classes("w-full"),
                    ),
                ).classes("mt-4").props("color=primary")
                ui.button("下载excel", on_click=self.download_aggrid_data).classes(
                    "mt-4"
                ).props("color=primary")

            # 添加分隔线
            # ui.separator()
            # 第二行：表格
        ui.separator()
        with ui.card().classes("w-full h-full"):
            # 表格内容:
            # self.ds.ui_table(columns=columns).classes("w-full h-full")
            # ui.separator()
            self.ds.ui_aggrid(
                options={"columnDefs": columns, "defaultColDef": {"flex": 1}}
            ).classes("w-full h-full")

    def download_aggrid_data(self):

        if not self.df.empty:
            try:
                data = io.BytesIO()
                self.df.to_excel(data)
                data.seek(0)
                ui.download(data.read(), "出勤分析.xlsx")
                ui.notify("Excel 文件下载已启动。", type="positive")
            except Exception as e:
                print("下载数据时出错：", e)
                ui.notify("下载数据时出错，请联系管理员。", type="negative")
        else:
            ui.notify("没有数据可供下载。", type="negative")

    # def onclick(self):
    #     if not self.df.empty:
    #         try:
    #             # 更全面地清洗数据，将各种无法处理的值替换为空字符串
    #             def clean_value(x):
    #                 if pd.isna(x):
    #                     return ""
    #                 if isinstance(x, (list, dict, set, tuple)):
    #                     return ""
    #                 return x

    #             xl_df = self.df.copy().applymap(clean_value)
    #             # 使用相对路径生成文件路径
    #             import os

    #             base_dir = os.path.dirname(
    #                 os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    #             )
    #             img_dir = os.path.join(base_dir, "img")
    #             file_path = os.path.join(img_dir, "attendance.xlsx")
    #             xl_df.to_excel(file_path, index=False)
    #             ui.download.file(file_path)
    #             ui.notify("Excel 文件已成功保存到 img 目录。", type="positive")
    #         except Exception as e:
    #             print("生成 Excel 文件时出错：", e)
    #             ui.notify("生成 Excel 文件时出错，请联系管理员。", type="negative")
    #     else:
    #         ui.notify("没有数据可供生成 Excel 文件。", type="negative")


def entry_page():
    with theme.frame("考勤分析"):
        ui.page_title("ww的简介")
        ep = AttendancePage()
        ep.entry_page_content()
